Amazon EventBridge Input transformer을 이용하여 CloudWatch Alarm 경보 메일의 제목과 내용을 커스텀 하기
안녕하세요 클레스메소드의 서은우 입니다.
Amazon SNS를 통해 통지되는 CloudWatch Alarm 경보 이메일의 제목과 내용을 커스텀하는 방법에 대해 소개하도록 하겠습니다.
CloudWatch Alarm이 Amazon SNS를 통해 경보 메일을 전송하는 경우
CloudWatch Alarm와 Amazon SNS를 이용하면 경보에 관한 내용을 아래와 같은 이메일로 수신 받을 수 있습니다.
메일은 경보상태: "대상명" in 리전
과 같은 형식의 제목으로 수신되어집니다. 이런 제목만으로도 대략적인 내용을 파악할 수 있지만, 제목에 본인이 원하는 정보를 표시할 수 있다면 제목만으로도 알람의 내용을 파악할 수 있고 필터링하기에도 편할 것입니다.
또한 알람과 관련하여 꽤나 많은 정보들을 메일로 받게 되기 때문에 이메일로 보내어질 내용들을 미리 설정해 둘 수 있다면 자신에게 필요한 정보들을 얻기 편리해질 것입니다.
이것을 구현하기 위해서 EventBridge와 Step functions를 사용할 수 있습니다.
아키텍처
변경 전 아키텍처
이벤트가 발생하면 CloudWatch Alarm이 SNS로 경보 내용을 보내고, SNS는 사용자의 이메일로 해당 내용을 전송합니다.
변경 후 아키텍처
변경 후 아키텍처에서는 EventBridge Rule과 Step Functions State Machine이 추가되었습니다.
EventBridge Rule에는 발생한 CloudWatch Alarm 이벤트를 감지하여 사용자에게 전송할 메일의 제목과 내용을 커스텀하고, Step Functions의 상태머신을 트리거하는 내용이 작성되어 있습니다. 그리고 트리거 된 Step Functions State Machine은 SNS Publish API를 호출하여 사용자에게 발생한 이벤트와 관련된 내용의 메일을 전송하게 됩니다.
리소스 생성
Step Functions
State Machine
SNS Publish API를 호출할 상태 머신을 생성합니다.
Amazon SNS Pbulish API를 선택합니다. Integration type은 AWS SDK - new를 선택하고 JSON형식의 파라미터를 입력합니다. 입력할 내용은 다음과 같습니다.
{ "TopicArn": "SNS TOPIC ARN", "Subject.$": "$.subject", "Message.$": "$.message" }
TopicArn
: 이메일을 전송할 SNS 토픽의 ARNSubject.$
: EventBridge에서 커스텀한 이메일의 제목Message.$
: EventBridge에서 커스텀한 이메일의 내용
EventBridge Rule
EventBridge Rule을 작성합니다. 생성한 State Machine을 타겟으로 지정하고 Input transformer 기능을 사용하여 전송할 이메일의 제목과 내용을 커스텀합니다.
Input transformer
Input path
Input path에는 발생한 Event의 항목을 참조하고 값을 변수로 지정할 수 있습니다. 각 Event 항목에 대한 내용은 Sample event 참고할 수 있습니다.
{ "time": "$.time", "region": "$.region", "state": "$.detail.state.value", "period": "$.detail.configuration.metrics[0].metricStat.period", "name": "$.detail.configuration.metrics[0].metricStat.metric.name", "instanceid": "$.detail.configuration.metrics[0].metricStat.metric.dimensions.InstanceId" }
Template
Template에서는 State Machine가 SNS Publish API 호출할때 파라미터로 사용할 값을 설정합니다.
subject
는 이메일의 제목으로 최대 100자 미만의 텍스트여야하며 개행은 포함하지 말아야합니다. message
는 이메일의 내용으로 256 KB를 넘어서는 안됩니다.
{ "subject": ": \"\" \"\" in ", "message": "Resource: \n Time: <time>\n Region: \n State: \n Metric: \n Period: \n" }
결과 확인
설정한대로 메일이 잘 도착하는 것을 확인할 수 있습니다.